package cn.springcloud.fix.demo.io;

import java.io.IOException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.Iterator;
import java.util.Set;

public class SubReactor implements Runnable {

    private final ServerSocketChannel ssc;
    private final Selector selector;
    private boolean restart = false;
    private int num;

    public SubReactor(Selector selector, ServerSocketChannel ssc, int num) {
        this.ssc = ssc;
        this.selector = selector;
        this.num = num;
    }

    //SubReactor Reactor 和 Accept 的构造函数中执行  good  被阻塞了  当有用户请求发送过来的时候，accept read write
    //  再次打印了两三个 System.out.println("waiting for restart");
    // 两三个突破阻塞 ，并进行请求分发，交给对应的Accpet ReadState WriteState来处理

    @Override
    public void run() {   // 什么时候调用这个run方法
        while (!Thread.interrupted()) { // 在线程被中断前持续运行
            System.out.println("waiting for restart");   // 第一，启动的时候这里打印8个；第四，连接过来这里打印两句
            while (!Thread.interrupted() && !restart) { // 在线程被中断前以及被指定重启前持续运行
                try {
                    if (selector.select() == 0)
                        continue; // 若沒有事件就绪则不往下执行
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Set<SelectionKey> selectedKeys = selector.selectedKeys(); // 取得所有已就绪事件的key集合
                Iterator<SelectionKey> it = selectedKeys.iterator();
                while (it.hasNext()) {
                    dispatch(it.next()); // 根据事件的key进行调度
                    it.remove();
                }
            }
        }
    }

    private void dispatch(SelectionKey key) {
        Runnable r = (Runnable) (key.attachment()); // 根据事件之key绑定的对象开启线程
        if (r != null)
            r.run();  // 对于每一个TCPSubReactor，调用它们的run()
    }

    public void setRestart(boolean restart) {
        this.restart = restart;
    }
}
